#include "uart.c"
#include "timer.c"
#include <regx52.h>

/**
 * 实现一个打地鼠游戏，随机点亮一个灯，用户按下对应按键。灯灭后，再随机亮灯。
 * 检测游戏失败：设定一个阈值，连续进入几次中断后，发现上一次点亮的灯没有被熄灭，就认定游戏失败
 * 将当前点亮的灯进行闪烁。
 *
 * 增加一个开始按钮，点击开始按钮，游戏重新开始。
 * 如果在游戏进行中，点击该按钮，则暂停游戏，再次点击则恢复游戏。
 * 暂停游戏中，进行流水灯闪烁。
 */

// 定义开始和暂停共用按钮
sbit START_BUTTON = P3 ^ 0;
// 打地鼠所显示的灯
sbit LED = P2 ^ 0; // 明确指定是P2.0引脚
// 灯所对应的按钮
sbit BTN = P1 ^ 0; // 明确指定是P1.0引脚

// 全局变量
unsigned int current_led = 0;
unsigned int fail_count = 0;   // 失败次数
unsigned int game_started = 0; // 游戏开始
unsigned int game_paused = 0;  // 游戏暂停
unsigned int flash_count = 0;  // 刷新次数

// 定时器0中断服务函数
void timer0_ISR() interrupt 1
{
    TH0 = (65536 - 50000) / 256; // 重新加载初值，定时50ms
    TL0 = (65536 - 50000) % 256;

    if (game_started && !game_paused)
    {
        // 检查上一次点亮的灯是否熄灭
        if (LED == 1)
        {
            fail_count++;
            if (fail_count >= 3) // 设定阈值为3次
            {
                // 游戏失败，这里可以添加游戏失败的处理逻辑
                game_started = 0;
                LED = 0; // 熄灭灯
            }
        }
        else
        {
            fail_count = 0;
        }

        // 随机决定是否点亮灯
        if (timer_rand() % 2 == 0)
        {
            LED = 1;
        }
        else
        {
            LED = 0;
        }

        // 让当前点亮的灯闪烁
        flash_count++;
    }
    else if (game_paused)
    {
        // 暂停游戏时，进行流水灯闪烁
        static unsigned char shift = 0;
        P2 = 0x01 << shift;
        shift = (shift + 1) % 8;
    }
}

// 开始按钮中断服务函数
void start_button_ISR() interrupt 0
{
    if (game_started)
    {
        game_paused = !game_paused; // 切换游戏暂停状态
    }
    else
    {
        game_started = 1; // 开始新游戏
        game_paused = 0;
        fail_count = 0;
        timer0_init(); // 初始化定时器
        LED = 0;       // 初始化LED，熄灭
    }
}

void main()
{
    uart_init(); // 初始化串口
    IT0 = 1;
    EX0 = 1;
    EA = 1; // 开总中断

    LED = 0; // 初始化LED，熄灭

    while (1)
    {
        if (game_started && !game_paused)
        {
            // 检测按键按下
            if (BTN == 0)
            {
                delay_ms(20); // 消抖
                if (BTN == 0)
                {
                    // 按下对应按键，熄灭当前灯
                    LED = 0;
                    while (BTN == 0)
                        ; // 等待按键释放
                }
            }

            // 让当前点亮的灯闪烁
            if (LED == 1 && flash_count % 2 == 0)
            {
                LED = 0;
            }
            else if (LED == 1)
            {
                LED = 1;
            }
        }
    }
}